// routes/person.js 使用的路由处理函数

// fs, path
const fs = require('fs')
const path = require('path')

// 导入相关模型
const { PersonModel } = require('../db/model')
const moment = require('moment')
// 配置成中文
moment.locale('zh-cn');

// 获取用户列表
const list = async (req, res) => {
  // 1. 拿出参数
  const { current, pagesize, is_status, gender, search } = req.query

  // 2. 按照参数从数据库中获取内容
  // 2-1. 计算开始索引
  const start = (current - 1) * pagesize
  // 2-2. 添加两个筛选条件
  const info = {
    nickname: new RegExp(search) ,
    gender: new RegExp(gender === 'all' ? '' : gender),
    is_delete: 0,
  }
  // 判断是否禁用的条件
  // 注意: 你的 is_status 是 1 和 0
  if (is_status !== 'all') info.is_status = is_status - 0 ? true : false
  const result = await PersonModel.find(info).skip(start).limit(pagesize)

  // 3. 获取总数
  const total = (await PersonModel.find(info)).length

  const list = []

  result.forEach(item => {
    list.push({
      id: item._id,
      username: item.username,
      password: item.password,
      nickname: item.nickname,
      gender: item.gender,
      age: item.age,
      desc: item.desc,
      avatar: item.avatar,
      is_status: item.is_status,
      createTime: moment(item.createTime).format('LLLL')
    })
  })

  res.send({
    code: 1,
    message: '获取用户列表成功',
    list: list,
    totalPage: Math.ceil(total / pagesize)
  })
}

// 修改用户状态
const status = async (req, res) => {
  // 1. 拿到参数信息
  const { id, status } = req.body

  // 2. 操作数据库修改信息
  await PersonModel.findByIdAndUpdate(id, { is_status: (status - 0 === 1 ? true : false) })

  // 3. 返回给前端修改完毕的信息
  res.send({
    code: 1,
    message: '修改用户状态成功, 当前用户已经被 ' + (status ? '启用' : '禁用')
  })
}

// 重置用户密码
const reset = async (req, res) => {
  // 1. 获取用户 id
  const { id } = req.body
  // 2. 操作数据库修改密码
  await PersonModel.findByIdAndUpdate(id, { password: '123456' })

  // 3. 返回给前端重置完毕的信息
  res.send({
    code: 1,
    message: '当前用户密码重置成功'
  })
}

// 重置用户密码
const deleteUser = async (req, res) => {
  // 1. 获取用户 id
  const { id } = req.body
  // 2. 操作数据库修改为逻辑删除
  await PersonModel.findByIdAndUpdate(id, { is_delete: 1 })

  // 3. 返回给前端重置完毕的信息
  res.send({
    code: 1,
    message: '用户删除成功'
  })
}

// 添加用户
const add = async (req, res) => {
  // 获取请求信息
  const { username, password, nickname } = req.body
  // 判断用户名是否已占用
  const user = await PersonModel.findOne({ username })
  if (user) return res.send({ code: 0, message: '用户名已被占用, 请重新输入' })
  // 将用户信息插入数据库
  await PersonModel({ username, password, nickname }).save()
  res.send({
    code: 1,
    message: '添加成功'
  })
}

// 获取用户个人信息
const info = async (req, res) => {
  const { id } = req.params

  // 根据 id 获取个人信息
  const result = await PersonModel.findById(id)
  // 返回给前端
  res.send({
    code: 1,
    message: '获取个人信息成功',
    info: {
      id: result._id,
      nickname: result.nickname,
      username: result.username,
      age: result.age,
      gender: result.gender,
      avatar: result.avatar,
      desc: result.desc
    }
  })
}

// 编辑用户信息
const update = async (req, res) => {
  // 拿到信息直接使用
  const { nickname, age, gender, desc, id, avatar } = req.body
  if (avatar) {
    await PersonModel.findByIdAndUpdate(id ,{ nickname, age, gender, desc, avatar })
    // 复制图片文件到 shop 系统中
    const sourceFile = path.resolve(__dirname, '..' + avatar);
    const destPath = path.resolve(__dirname, '../../shop_server' + avatar);
    const readStream = fs.createReadStream(sourceFile);
    const writeStream = fs.createWriteStream(destPath);
    readStream.pipe(writeStream);
  } else {
    await PersonModel.findByIdAndUpdate(id ,{ nickname, age, gender, desc })
  }
  res.send({
    code: 1,
    message: '个人信息修改成功'
  })
}

module.exports = {
  list,
  status,
  reset,
  deleteUser,
  add,
  info,
  update,
}
